﻿using System;
using System.Collections.Generic;

namespace Mars.Module
{
    public static class ModuleManager
    {
        private static readonly List<BaseModule> modulesList = new();

        /// <summary>
        /// 所有游戏框架模块轮询。
        /// </summary>
        /// <param name="elapseSeconds">逻辑流逝时间，以秒为单位。</param>
        /// <param name="realElapseSeconds">真实流逝时间，以秒为单位。</param>
        public static void Update(float elapseSeconds, float realElapseSeconds)
        {
            foreach (var module in modulesList)
            {
                module.Update(elapseSeconds, realElapseSeconds);
            }
        }

        /// <summary>
        /// 关闭并清理所有游戏框架模块。
        /// </summary>
        public static void Shutdown()
        {
            foreach (var module in modulesList)
            {
                module.Shutdown();
            }

            modulesList.Clear();
        }

        /// <summary>
        /// 获取游戏框架模块。
        /// </summary>
        /// <typeparam name="T">要获取的游戏框架模块类型。</typeparam>
        /// <returns>要获取的游戏框架模块。</returns>
        /// <remarks>如果要获取的游戏框架模块不存在，则自动创建该游戏框架模块。</remarks>
        public static T GetModule<T>(bool autoCreate = true) where T : BaseModule
        {
            var moduleType = typeof(T);
            return GetModule(moduleType, autoCreate) as T;
        }

        /// <summary>
        /// 获取游戏框架模块。
        /// </summary>
        /// <param name="moduleType">要获取的游戏框架模块类型。</param>
        /// <returns>要获取的游戏框架模块。</returns>
        /// <remarks>如果要获取的游戏框架模块不存在，则自动创建该游戏框架模块。</remarks>
        public static BaseModule GetModule(Type moduleType, bool autoCreate = true)
        {
            foreach (var module in modulesList)
            {
                if (module.GetType() == moduleType)
                {
                    return module;
                }
            }

            if (autoCreate)
            {
                return CreateModule(moduleType);
            }
            else
            {
                return null;
            }
        }


        /// <summary>
        /// 创建游戏框架模块。
        /// </summary>
        /// <param name="moduleType">要创建的游戏框架模块类型。</param>
        /// <returns>要创建的游戏框架模块。</returns>
        public static BaseModule CreateModule(Type moduleType)
        {
            var module = (BaseModule)Activator.CreateInstance(moduleType);
            if (module == null)
            {
                throw new Exception($"Can not create module '{moduleType.FullName}'.");
            }

            modulesList.Add(module);
            SortModules();
            return module;
        }

        private static void SortModules()
        {
            modulesList.Sort((x, y) => y.Priority.CompareTo(x.Priority));
        }
    }
}